#title: 如何定义对象
#index:0,1
#author:zozoh(zozohtnt@gmail.com)

--------------------------------------------------------------------------------------------------------
鸭子法则

	{*如果它走路像鸭子，说话像鸭子，样子像鸭子，叫声也像鸭子，那它就是一只鸭子。}
	
	对于 Nutz Ioc 来说，它面对的配置文件就是层层嵌套的 "名值对集合"，或者说是 Map 集合。
	事实上，它是先把整个配置文件解析成 Map 再做判断的。
	
	如果一个 Map 仅包括如下的键，则被认为是一个注入对象：
	
	 || {*type}        	|| {#080; 对象类型} ||
	 || {*singleton}   	|| {#080; 是否单例} ||
	 || {*scope}       	|| {#080; 生命周期范围} ||
	 || {*events}		|| {#080; 监听事件} ||
	 || {*args}			|| {#080; 构造函数参数} ||
	 || {*fields}		|| {#080; 字段设定} ||
	 || {*factory}		|| {#080; 工厂方法} ||
	
	否则，这个 Map 被认为，是在声明对象的每个字段。

--------------------------------------------------------------------------------------------------------
匿名对象
	
	如果，一个字段的值就是这样一个 “鸭子 Map” 呢？ 那么，自然会被认为是另外一个对象。这个
	对象没有名字，你不能通过 Ioc 接口直接获得，它隐藏在某个对象的某个字段里面。所以我们
	称这个对象为 {*匿名对象}
	
	匿名对象，没有所谓的单例，你声明了 singleton: true 也没有用。如果它的宿主是单例，它自
	然也只会被创建一次。否则，每次宿主被创建的时候，它都会被创建。
	
	JSON 配置文件：
		{{{<js>
		var ioc = {
			xb : {
				name : 'XiaoBai',
				// 请注意，在这里， friend 字段，直接声明了另外一个对象
				friend : {
					type : 'nutz.demo.ioc.book.Pet',
					fields : {
						name : 'XiaoHei'
					}
				}
			}
		}
		}}}
	
	调用代码
		{{{<JAVA>
		Ioc ioc = new NutIoc(new JsonLoader("nutz/demo/ioc/book/inner.js"));
		Pet pet = ioc.get(Pet.class, "xb");
		System.out.println(pet.getFriend().getName());
		ioc.depose();
		}}}
		
	控制台输出
		{{{
		XiaoHei
		}}}

--------------------------------------------------------------------------------------------------------
JSON 加载器

    从上面的例子代码可以看出来，Nutz 的Ioc实现需要你提供一个加载器给它。
    
    {{{
    Ioc ioc = new NutIoc(new JsonLoader("nutz/demo/ioc/book/inner.js"));
                                 ^
                                 +----- 这里你提供了一个加载器
    }}}
    
    你这个加载器是怎么实现的 NutIoc 并不关心。
    在 Nutz 最早的版本，它提供的第一个加载器就是 JsonLoader。

    对于 JsonLoader 更多的描述，请参看 [ioc_loader.man 配置文件的格式]

-------------------------------------------------------------------------------------------------------
工厂方法

	语法:
	
	{{{<js>
		{
			type : "net.wendal.nutzbook.Cache",
			args : ["user_profile_cache"],
			factory:"xxx.xx.xxxxCacheFactory#create"
		}
	}}}
	
	其中 xxx.xx.xxxxFactory是工厂类的类全名, create是工厂方法, 其参数是"user_profile_cache"

	从1.b.53开始,支持ioc bean做factory bean
	
	{{{<js>
		{
			type : "net.wendal.nutzbook.Cache",
			args : ["user_profile_cache"],
			factory:"$beanCacheFactory#create"
		}
	}}}
	
	其中的beanCacheFactory是另外一个ioc bean的名称, create是工程方法的名字, 参数列表需要与args一致

生命周期范围
-------------------------------------------------------------------------------------------------------

    默认的scope是app, 与ioc容器共存亡. 可选的还有request和session, 已经很少很少使用,且仅限于子模块类及其依赖的对象.
    
    一般情况下,不需要也不应该设置scope的值.











